# @Time : 2024/11/7 21:59
# @Author : Fioman 
# @Phone : 13149920693
"""
__getitem__(): 调用时机
1) 当使用obj[] 访问对象的时候
2) 当使用for循环遍历这个对象,而这个对象又没有实现__iter__()方法的时候
3) 当对这个对象使用切片的时候比如obj[start:end:step] 实际上是调用了
    __getitem__(slice(start,end,step)) 传入的是一个切片对象,然后用户可以
    自定义切片的行为.
4) 当对一个对象使用in操作符的时候,然后这个对象又没有实现__contains__方法的时候,
     会使用for循环,然后如果又没有实现__iter__方法,就会调用__getitem__()方法

__len__(): 调用时机
1) 当使用len(obj)的时候会去调用obj的__len__()方法,如果没有实现__len__方法,会报错
"""


class Mylist:
    callCount = 0

    def __init__(self, value):
        self.value = value

    def __getitem__(self, item):
        Mylist.callCount += 1
        print(f"Mylist.__getitem__() 第 {Mylist.callCount} 次 调用")
        return self.value[item]

    def __len__(self):
        return len(self.value)


if __name__ == '__main__':
    mylist = Mylist([1, 2, 3, 4, 5, 6, 7, 8, 9])
    print(mylist[0])
    mylistSub = mylist[1:3]
    print(mylistSub)
    for i in mylist:
        print(i)

    print("长度为: ", len(mylist))
